/**
 * @工程名称：cargo-api
 * @程序包名：com.shenzhenair.cargo.support.util
 * @程序类名：Base64Utils.java
 * @创建日期：2019年8月8日
 */
package com.platform.common.security.utils;


import org.apache.commons.codec.binary.Base64;

import java.io.*;

//import org.apache.commons.net.util.Base64;

/**
 * @功能说明：
 * @创建人员：zhenghb
 * @变更记录：<BR>
 * 1、2019年8月8日 zhenghb 新建类
 */
public class Base64Utils {
	/**
   * 文件读取缓冲区大小
   */
  private static final int CACHE_SIZE = 1024;

  /**
   * @函数名称：decode
   * @创建日期：2019年8月8日
   * @功能说明：BASE64字符串解码为二进制数据
   * @参数说明：
   * @返回说明：byte[]
   */
  public static byte[] decode(String base64) throws Exception {
      return Base64.decodeBase64(base64.getBytes());
  }

  /**
   * @函数名称：encode
   * @创建日期：2019年8月8日
   * @功能说明：二进制数据编码为BASE64字符串
   * @参数说明：
   * @返回说明：String
   */
  public static String encode(byte[] bytes) throws Exception {
      return new String(Base64.encodeBase64(bytes));
  }

  /**
   * @函数名称：encodeFile
   * @创建日期：2019年8月8日
   * @功能说明：将文件编码为BASE64字符串 大文件慎用，可能会导致内存溢出
   * @参数说明：
   * @返回说明：String
   */
  public static String encodeFile(String filePath) throws Exception {
      byte[] bytes = fileToByte(filePath);
      return encode(bytes);
  }

  /**
   * @函数名称：decodeToFile
   * @创建日期：2019年8月8日
   * @功能说明：BASE64字符串转回文件
   * @参数说明：
   * @返回说明：void
   */
  public static void decodeToFile(String filePath, String base64) throws Exception {
      byte[] bytes = decode(base64);
      byteArrayToFile(bytes, filePath);
  }

  /**
   * @函数名称：fileToByte
   * @创建日期：2019年8月8日
   * @功能说明：文件转换为二进制数组
   * @参数说明：
   * @返回说明：byte[]
   */
  public static byte[] fileToByte(String filePath) throws Exception {
      byte[] data = new byte[0];
      File file = new File(filePath);
      if (file.exists()) {
          FileInputStream in = new FileInputStream(file);
          ByteArrayOutputStream out = new ByteArrayOutputStream(2048);
          byte[] cache = new byte[CACHE_SIZE];
          int nRead = 0;
          while ((nRead = in.read(cache)) != -1) {
              out.write(cache, 0, nRead);
              out.flush();
          }
          out.close();
          in.close();
          data = out.toByteArray();
       }
      return data;
  }

  /**
   * @函数名称：byteArrayToFile
   * @创建日期：2019年8月8日
   * @功能说明：二进制数据写文件
   * @参数说明：
   * @返回说明：void
   */
  public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception {
      InputStream in = new ByteArrayInputStream(bytes);
      File destFile = new File(filePath);
      if (!destFile.getParentFile().exists()) {
          destFile.getParentFile().mkdirs();
      }
      destFile.createNewFile();
      OutputStream out = new FileOutputStream(destFile);
      byte[] cache = new byte[CACHE_SIZE];
      int nRead = 0;
      while ((nRead = in.read(cache)) != -1) {
          out.write(cache, 0, nRead);
          out.flush();
      }
      out.close();
      in.close();
  }

  /**
   * @函数名称：encodeStr
   * @创建日期：2019年8月8日
   * @功能说明：使用Base64加密算法加密字符串
   * @参数说明：
   * @返回说明：String
   */
  public static String encodeStr(String plainText){
      byte[] b=plainText.getBytes();
      Base64 base64 = new Base64();
      b=base64.encode(b);
      String s=new String(b);
      return s;
  }

  /**
   * @函数名称：decodeStr
   * @创建日期：2019年8月8日
   * @功能说明：使用Base64加密算法解密字符串
   * @参数说明：
   * @返回说明：String
   */
  public static String decodeStr(String encodeStr){
      byte[] b=encodeStr.getBytes();
      Base64 base64 = new Base64();
      b=base64.decode(b);
      String s=new String(b);
      return s;
  }

    /***
     * 使用Base64加密算加密字符串
     * @param plainText 报文
     * @param charsetName  使 用 编码
     * @return
     * @throws Exception
     */
  public static String encodeStr(String plainText, String charsetName) throws Exception {
      byte[] b=plainText.getBytes(charsetName);
      return new Base64().encodeToString(b);
  }

    /***
     * 使用Base64加密算法解密字符串
     * @param encodeStr 报文
     * @param charsetName 使 用 编码
     * @return
     * @throws Exception
     */
  public static String decodeStr(String encodeStr, String charsetName) throws Exception {
      return new String(new Base64().decode(encodeStr),charsetName);
  }


    public static void main(String[] args) {


      String jmText="RlNVLzEyDQo3ODQtMjE1NTcwMjNUWU5OTkcvVDE2SzIyMy4wMDANClJDRi9DWjg2ODQvMTRKVUwxMzM2L05ORy9UMTZLMjIzL0UxMTQ1L0ExMzM2DQpPU0kv";

      try {
          String jeiMText =decodeStr(jmText,"UTF-8");
          System.out.println(jeiMText);
      }catch (Exception e){

      }



    }

}
